home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xsok-1.000 / xsok-1 / xsok-1.01 / src / mergescores.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  2KB  |  91 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdarg.h>
  5.  
  6. int highscore[300];
  7. int newscore[300];
  8.  
  9. #define MAGICH    0x741d    /* magic of xsok version 1 highscore file */
  10.  
  11. static void portable_to_internal(long *args, unsigned char *p, int num) {
  12.     do {
  13.     int j;
  14.     *args = 0;
  15.     for (j = 0; j < 4; ++j)
  16.         *args += (long)p[3-j] << (j << 3);
  17.     ++args;
  18.     p += 4;
  19.     } while (--num);
  20. }
  21. static void internal_to_portable(unsigned char *p, long *args, int num) {
  22.     do {
  23.     int j;
  24.     memset(p, (*args < 0 ? -1 : 0), 4);
  25.     for (j = 0; j < 4; ++j)
  26.         p[3-j] = (unsigned char)(*args >> (j << 3));
  27.     ++args;
  28.     p += 4;
  29.     } while (--num);
  30. }
  31. static void ReadHighscores(const char *filename) {
  32.     FILE *fp;
  33.     int i;
  34.     memset(highscore, 0, sizeof(highscore));
  35.     for (i = 100; i < 300; ++i)
  36.         highscore[i] = 0x7fffffff;
  37.     if ((fp = fopen(filename, "rb"))) {
  38.     long p[300];
  39.     int num;
  40.     unsigned char s[1200];
  41.     num = fread(s, 4, 300, fp);
  42.     portable_to_internal(p, s, num);    
  43.     for (i = 0; i < num; ++i)
  44.         highscore[i] = p[i];
  45.     fclose(fp);
  46.     }
  47.     highscore[0] = MAGICH;
  48. }
  49. static void WriteHighscores(const char *filename) {
  50.     FILE *fp;
  51.     if ((fp = fopen(filename, "wb"))) {
  52.     int i;
  53.     long p[300];
  54.     unsigned char s[1200];
  55.     for (i = 0; i < 300; ++i)
  56.         p[i] = highscore[i];
  57.     internal_to_portable(s, p, 300);
  58.     fwrite(s, 1, 1200, fp);
  59.     fclose(fp);
  60.     }
  61. }
  62.  
  63. static void mergescores(const char *filename) {
  64.     const char *base_name;
  65.     int i;
  66.     base_name = strrchr(filename, '/');
  67.     if (!base_name) {
  68.     fprintf(stderr, "need directory components for %s\n", filename);
  69.     exit(1);
  70.     }
  71.     ++base_name;
  72.     ReadHighscores(filename);
  73.     memcpy(newscore, highscore, sizeof(highscore));
  74.     ReadHighscores(base_name);
  75.     for (i = 1; i < 100; ++i)
  76.     if (newscore[i] > highscore[i])
  77.          highscore[i] = newscore[i];
  78.     for (i = 100; i < 300; ++i)
  79.     if (newscore[i] < highscore[i])
  80.          highscore[i] = newscore[i];
  81.     WriteHighscores(filename);
  82. }
  83.  
  84.  
  85. int main(int argc, char *argv[]) {
  86.     int i;
  87.     for (i = 1; i < argc; ++i)
  88.     mergescores(argv[i]);
  89.     return 0;
  90. }
  91.